home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Visual Cafe 3
/
Visual Cafe 3.ISO
/
Vcafe
/
Sample.bin
/
SimpleJdbcTableModel.java
< prev
next >
Wrap
Text File
|
1998-09-27
|
8KB
|
280 lines
import com.sun.java.swing.table.*;
import java.io.*;
import java.beans.*;
import java.sql.*;
import java.util.*;
public class SimpleJdbcTableModel extends com.sun.java.swing.table.AbstractTableModel implements java.io.Serializable
{
String jdbcDriverClass=null;
String jdbcDriverURL=null;
String query=null;
String user=null;
String password=null;
String[] columnNames = {};
Class[] columnTypes = {};
boolean[] columnWrite = {};
Vector rows = new Vector();
public SimpleJdbcTableModel()
{
}
//internal functions
Class columnTypeToColumnClass(int type)
{
switch(type)
{
case Types.CHAR:
case Types.VARCHAR:
case Types.LONGVARCHAR:
return String.class;
case Types.BIT:
return Boolean.class;
case Types.TINYINT:
case Types.SMALLINT:
case Types.INTEGER:
return Integer.class;
case Types.BIGINT:
return Long.class;
case Types.FLOAT:
case Types.DOUBLE:
return Double.class;
case Types.DATE:
return java.sql.Date.class;
default:
return Object.class;
}
}
public void doQuery()
{
Connection connection;
Statement statement;
ResultSet resultSet;
ResultSetMetaData metaData;
try
{
//get connection
Class.forName(jdbcDriverClass);
System.out.println("Opening db connection");
connection = DriverManager.getConnection(jdbcDriverURL, user, password);
statement = connection.createStatement();
//get data
resultSet = statement.executeQuery(query);
metaData = resultSet.getMetaData();
int numberOfColumns = metaData.getColumnCount();
columnNames = new String[numberOfColumns];
columnTypes = new Class[numberOfColumns];
columnWrite = new boolean[numberOfColumns];
// Get the column names/types and cache them.
// Then we can close the connection.
for(int column = 0; column < numberOfColumns; column++)
{
columnNames[column] = metaData.getColumnLabel(column+1);
columnTypes[column] = columnTypeToColumnClass(metaData.getColumnType(column+1));
columnWrite[column] = !metaData.isReadOnly(column+1);
}
// Get all rows.
rows = new Vector();
while (resultSet.next())
{
Vector newRow = new Vector();
for (int i = 1; i <= getColumnCount(); i++)
{
newRow.addElement(resultSet.getObject(i));
}
rows.addElement(newRow);
}
resultSet.close();
statement.close();
connection.close();
fireTableChanged(null); // Tell the listeners a new table has arrived.
}
catch (ClassNotFoundException ex)
{
System.err.println("Cannot find the database driver classes.");
ex.printStackTrace();
}
catch (SQLException ex)
{
System.err.println("Cannot connect to this database.");
ex.printStackTrace();
}
}
Object getColumnSafeValue(Object val, int col)
{
if((val==null) || (val.getClass().equals(columnTypes[col])))
{
return val;
}
else if(columnTypes[col].equals(String.class))
{
return String.valueOf(val);
}
else if(columnTypes[col].equals(Double.class))
{
if(val.getClass().getSuperclass().equals(Number.class))
{
return new Double(((Number)val).doubleValue());
}
else if (val.getClass().equals(String.class))
{
return Double.valueOf((String)val);
}
}
else if(columnTypes[col].equals(Integer.class))
{
if(val.getClass().getSuperclass().equals(Number.class))
{
return new Integer(((Number)val).intValue());
}
else if (val.getClass().equals(String.class))
{
return Integer.valueOf((String)val);
}
}
else if(columnTypes[col].equals(Long.class))
{
if(val.getClass().getSuperclass().equals(Number.class))
{
return new Long(((Number)val).longValue());
}
else if (val.getClass().equals(String.class))
{
return Long.valueOf((String)val);
}
}
else if(columnTypes[col].equals(Boolean.class))
{
if(val.getClass().getSuperclass().equals(Number.class))
{
return new Boolean(((Number)val).intValue() == 0 ? false : true);
}
else if (val.getClass().equals(String.class))
{
return Boolean.valueOf((String)val);
}
}
else if(columnTypes[col].equals(java.util.Date.class))
{
try
{
return java.text.DateFormat.getInstance().parse(String.valueOf(val));
}
catch(java.text.ParseException p)
{
p.printStackTrace();
}
}
//failing all else
System.out.println(columnTypes[col]);
return val;
}
//Properties:
public void setJdbcDriverClass(String jdbcDriverClass)
{
this.jdbcDriverClass = jdbcDriverClass;
}
public String getJdbcDriverClass()
{
return jdbcDriverClass;
}
public void setJdbcDriverURL(String driverURL)
{
jdbcDriverURL=driverURL;
}
public String getJdbcDriverURL()
{
return jdbcDriverURL;
}
public void setQuery(String theQuery)
{
query = theQuery;
}
public String getQuery()
{
return query;
}
public void setUser(String user)
{
this.user = user;
}
public String getUser()
{
return user;
}
public void setPassword(String pass)
{
password=pass;
}
public String getPassword()
{
return password;
}
//TableModel implementation:
public String getColumnName(int column)
{
return columnNames[column] == null ? "" : columnNames[column];
}
public Class getColumnClass(int column)
{
return columnTypes[column];
}
public boolean isCellEditable(int row, int column)
{
return columnWrite[column];
}
public int getRowCount()
{
return rows.size();
}
public int getColumnCount()
{
return columnNames.length;
}
public Object getValueAt(int rowIndex, int columnIndex)
{
try
{
return ((Vector)rows.elementAt(rowIndex)).elementAt(columnIndex);
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
}
//note, setValueAt does not actually edit the back-end (just edits the data in memory). It would be fairly simple to
//add such functionality should it become necessary.
public void setValueAt(Object value, int row, int column)
{
Object val=getColumnSafeValue(value, column);
((Vector)rows.elementAt(row)).setElementAt(val, column);
}
}